【问题标题】:Adding namespace limits results Linq to XML添加命名空间限制结果 Linq to XML
【发布时间】:2014-06-07 09:17:32
【问题描述】:

我已经阅读了几篇关于 Linq to XML 的文章,但要么我理解错了,要么错过了一些难题。

我试图实现的是加载一些 XML,通过不同的命名字段和节点/元素获取所需的数据。这是 XML

<?xml version="1.0" encoding="utf-8"?>
<metadata created="2014-05-15T12:26:07.701Z" xmlns="http://site/cu-2.0#" xmlns:ext="http://site/cu/b-2.0">
  <customer-list count="47" offset="0">
    <customer id="7123456" type="Cust" ext:mark="1">
      <name>Tony Watt</name>
      <sort-name>Watt, Tony</sort-name>
      <gender>male</gender>
      <country>US</country>
      <knownAs-list>
        <knownAs locale="ko" sort-name="Tony Watt"</knownAs>
        <knownAs locale="ja" sort-name="Watt Tony"</knownAs>
      </knownAs-list>
    </customer>
    <tag-list>
        <tag count="1">
          <name>Country</name>
        </tag>
        <tag count="1">
          <name>usa</name>
        </tag>
  <customer id="9876543" type="Cust" ext:mark="2">

所以我可以加载 XML 并显示数据。这是代码的sn-p

    Dim ns As XNamespace = "http://site/cu-2.0#"
    Dim XDoc As XDocument = XDocument.Parse(SomeXML)

    For Each c As XElement In XDoc.Descendants(ns + "name")
        Response.Write(c)
    Next

所以这会显示所有带有“名称”的元素。我在这里遇到的问题是我想要客户名称而不是标签列表国家名称(请参阅 XML 的最后几行)

理想情况下,我想返回每个客户的所有详细信息,但是当我还需要其他数据时,添加命名空间会将我限制为具有名称的所有元素。如果我删除命名空间,我不会返回任何结果,所以我不确定下一步该怎么做?

我已经阅读了大量文章,但我似乎无法弄清楚需要做什么,或者我是否走错了路?请记住,我尝试过其他方法,如果有人喜欢,我可以发布,但在阅读 MSDN 和其他文章后,我认为我感到困惑或错过了一步。

【问题讨论】:

    标签: vb.net linq-to-xml


    【解决方案1】:

    我想你只是想使用

    Dim ns As XNamespace = "http://site/cu-2.0#"
    Dim XDoc As XDocument = XDocument.Parse(SomeXML)
    
    For Each c As XElement In XDoc.Descendants(ns + "customer")
        Response.Write(c.Element(ns + "name").Value)
    Next
    

    【讨论】:

    • 这已经返回结果并且非常接近我所追求的。如果我将 Response.Write 行更改为 (a label) Label1.Text += ar.Element(ns + "name").Value & ar.Element(ns + "country").Value & "
      "然后我得到 Object not set to an instance 错误(否则,如果我删除代码的后半部分,我会得到返回的名称)
    • 这表明有些customer 元素没有country 子元素。因此,您可能希望修改代码以使用 Label1.Text += CStr(ar.Element(ns + "name")) + "; " + CStr(ar.Element(ns + "country")) + "&lt;br&gt;",利用 XElement 允许的转换/转换。
    【解决方案2】:

    如果你想从客户那里得到名字,试试这个

        Dim xe As XElement =
            <customer-list count="47" offset="0">
                <customer id="7123456" type="Cust" mark="1">
                    <name>Tony Watt</name>
                    <sort-name>Watt, Tony</sort-name>
                    <gender>male</gender>
                    <country>US</country>
                    <knownAs-list>
                        <knownAs locale="ko" sort-name="Tony Watt"></knownAs>
                        <knownAs locale="ja" sort-name="Watt Tony"></knownAs>
                    </knownAs-list>
                </customer>
                <customer id="1" type="Cust" mark="1">
                    <name>Fred Flintstone</name>
                    <sort-name>Flintstone, Fred</sort-name>
                    <gender>male</gender>
                    <country>US</country>
                    <knownAs-list>
                        <knownAs locale="ko" sort-name="Fred Flintstone"></knownAs>
                        <knownAs locale="ja" sort-name="Flintstone Fred"></knownAs>
                    </knownAs-list>
                </customer>
                <tag-list>
                    <tag count="1">
                        <name>Country</name>
                    </tag>
                    <tag count="1">
                        <name>usa</name>
                    </tag>
                </tag-list>
            </customer-list>
    
        Dim ie As IEnumerable(Of XElement) = From c As XElement In xe.Elements
                                             Where c.Name.LocalName = "customer"
                                             Select c From n As XElement In c.Elements
                                                      Where n.Name.LocalName = "name" Select n
    
    
        For Each r As XElement In ie
            Debug.WriteLine(r.Value)
        Next
    

    【讨论】:

    • 抱歉,没有返回任何结果。
    • 'This' 与示例中一样,还是您将其添加到代码中时?
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多