【问题标题】:How to read complex XML using linq C#如何使用 linq C# 读取复杂的 XML
【发布时间】:2018-11-10 21:47:11
【问题描述】:

我想读取一个 xml 文件...当它是简单的 xml 时它工作得很好,但是当它是复杂的 xml 时它不起作用。例如:

简单的 XML:

<?xml version="1.0" encoding="utf-8" ?>
<FILE>
  <CLIENTS>
    <CLIENT>
      <NAME>William</NAME>
      <AGE>25</AGE>
    </CLIENT>

    <CLIENT>
      <NAME>John</NAME>
      <AGE>31</AGE>
    </CLIENT>
  </CLIENTS>
</FILE>

C#:

XDocument document = XDocument.Load(path);
var clientNodes = from clt in document.Descendants("CLIENTS") select clt;
//This works and "clientNodes" has values for clients node

但是当我想加载更复杂的xml时,来自文件的查询是空的

复杂的 XML:

<?xml version="1.0" encoding="UTF-8"?>

<SII:RESPONSE xmlns:SII="http://www.sii.cl/XMLSchema">

<SII:RESPONSE_STATUS>
    <SII:STATE>1</SII:STATE>
</SII:RESPONSE_STATUS>
<SII:RESPONSE_CONTENT>
    <CREATED_BY>
        <ID>233</ID>
        <NAME>Sophy</NAME>
    </CREATED_BY>
    <CLIENT>
        <NAME>William</NAME>
        <AGE>25</AGE>
    </CLIENT>
    <CLIENT>
        <NAME>John</NAME>
        <AGE>25</AGE>
    </CLIENT>
</SII:RESPONSE_CONTENT>

C#:

XDocument documentoXML = XDocument.Load(path);
var simpleNodes = from clt in document.Descendants(XName.Get("SII", "RESPONSE_CONTENT")) select clt;

//这不起作用,“simpleNodes”没有值:(

请帮忙!

【问题讨论】:

  • 您应该为此尝试适当的 XML 解析器。只要您没有任何转义的控制字符或类似的东西,LINQ 就可以工作。好人甚至可以验证它是否遵循适当的 shema。
  • @Christopher:您指的是哪些“转义控制字符”?一些数字字符引用(nnnn;)?我从来没有遇到过使用 LINQ 解析这些的问题。你可以根据模式进行验证;见docs.microsoft.com/en-us/dotnet/api/…
  • @KlausGütter:因为在 X(ML)Document 上工作的 System.XML.Shema.Validate 是适当的 XML 解析器的一部分。而不是用 LINQ 解析整个东西。所以感谢一个正确的 XML 解析器的例子。只是为什么听起来你不同意我的观点? :)

标签: c# xml linq


【解决方案1】:

这应该是

XName.Get("RESPONSE_CONTENT", "http://www.sii.cl/XMLSchema")

或更简单:

XNamespace sii = "http://www.sii.cl/XMLSchema";

然后

document.Descendants(sii + "RESPONSE_CONTENT")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多