我有一个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 回答
你的问题是xml namespaces
使用Linq2Xml
您的根元素
FileFeed
具有名称空间属性 . 这意味着它内部的每个元素也使用该命名空间 .Element方法将
XName
作为其参数 . 通常你使用一个得到implicitly converted into an XName的字符串 .如果要包含命名空间,请创建
XNamespace
并添加字符串 . 自XNamespace overloads the + operator以来,这也将导致XName
.Xml名称空间或多或少像C#名称空间 . 在设置或未设置其命名空间时,您是否能够访问该类?
VS
他们是两个DISTINCT课程!这同样适用于XML - 通过设置命名空间,您可以使文档具有相似或甚至相同的内部结构,但它们代表了两个不可交换的不同文档 . 这真的很方便 .
如果您想获得有关实际读取方法不考虑命名空间的原因的帮助,则必须提供C#代码 . 一般规则是任何读取API都可以设置实际读取的命名空间 .