-1

我有一个 C# 程序尝试读取以下 xml,但无法读取任何元素:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Comments Here -->
    <FileFeed 
    xmlns="http://www.mycompany.com/schemas/xxx/FileFeed/V1" 
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.somecompany.com/schemas/xxx/FileFeed/V1 
    FileFeed.xsd" 
    RecordCount = "1">
<Object>
    <ID>PAMSMOKE110113xxx</ID>
    <CorpID>12509</CorpID>
    <AnotherID>201654702345</AnotherID>
    <TimeStamp>2013-09-03</TimeStamp>
    <Type>Some Type</Type>
    <SIM_ID>89011704258012600767</SIM_ID>
    <Code>ZZZ</Code>
    <Year>2013</Year>
</Object>
</FileFeed>

使用上述 XML,我的 C# 程序无法读取任何元素。例如,ID 元素始终为 NULL。

现在,如果我只是从上面的 XML 中删除第一个 xmlns,我的程序可以毫无问题地读取所有元素。问题是我必须以给我的格式处理 XML 文件,并且不能更改文件格式。我的程序可以很好地读取以下 XML:请注意 xmlns="http://www.mycompany.com/schemas/xxx/FileFeed/V1" 行已删除。

   <?xml version="1.0" encoding="UTF-8"?>
    <!-- Comments Here -->
    <FileFeed 
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.somecompany.com/schemas/xxx/FileFeed/V1        
        FileFeed.xsd" 
        RecordCount = "1">
        <Object>
            <ID>PAMSMOKE110113xxx</ID>
            <CorpID>12509</CorpID>
            <AnotherID>201654702345</AnotherID>
            <TimeStamp>2013-09-03</TimeStamp>
            <Type>Some Type</Type>
            <SomeNumber>89011704258012600767</SomeNumber>
            <Code>ZZZ</Code>
            <Year>2013</Year>
        </Object>
    </FileFeed>

我意识到我没有发布任何代码,只是想知道我可能遇到什么问题,只需删除 xmlns 行就可以解决所有问题?

4

3 回答 3

1

您的根元素FileFeed具有命名空间属性。这意味着其中的每个元素也使用该名称空间。

Element方法将 anXName作为其参数。通常你使用一个被隐式转换为XName.

如果要包含命名空间,请创建XNamespace并添加字符串。由于XNamespace重载+运算符,这也将导致XName.

XDocument doc = XDocument.Load("Test.xml");

// this will be null
XElement objectElementWithoutNS = doc.Root.Element("Object");

XNamespace ns = doc.Root.GetDefaultNamespace();
XElement objectElementWithNS = doc.Root.Element(ns + "Object");
于 2013-11-02T21:16:49.937 回答
1

您的问题与xml 命名空间有关

使用 Linq2Xml

XNamespace ns = "http://www.mycompany.com/schemas/xxx/FileFeed/V1";
var xDoc = XDocument.Load(fname);
var id = xDoc.Root.Element(ns + "Object").Element(ns + "ID").Value;
于 2013-11-02T20:48:57.063 回答
-1

Xml 命名空间或多或少类似于 C# 命名空间。当设置或未设置名称空间时,您能否访问一个类?

public namespace My.Company.Schemas {
   public class FileFeed

对比

public class FileFeed {

他们是两个不同的类!这同样适用于 XML - 通过设置名称空间,您可以拥有具有相似甚至相同内部结构的文档,但它们代表两个不可交换的不同文档。这真的很方便。

如果您想获得有关为什么您的实际阅读方法不考虑命名空间的帮助,您必须提供 C# 代码。不过一般规则是,任何读取 API 都可以为实际读取设置命名空间。

于 2013-11-02T20:20:05.373 回答