首页 文章

为什么有一个xmlns导致我的C#程序不读取XML?

提问于
浏览
-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行解决所有问题?

3 回答

  • 1

    你的问题是xml namespaces

    使用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;
    
  • 1

    您的根元素 FileFeed 具有名称空间属性 . 这意味着它内部的每个元素也使用该命名空间 .

    Element方法将 XName 作为其参数 . 通常你使用一个得到implicitly converted into an XName的字符串 .

    如果要包含命名空间,请创建 XNamespace 并添加字符串 . 自XNamespace overloads the + operator以来,这也将导致 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");
    
  • -1

    Xml名称空间或多或少像C#名称空间 . 在设置或未设置其命名空间时,您是否能够访问该类?

    public namespace My.Company.Schemas {
       public class FileFeed
    

    VS

    public class FileFeed {
    

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

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

相关问题