添加命名空间限制会将Linq转换为XML

时间:2014-06-07 09:17:32

标签: vb.net linq-to-xml

我已经阅读了一些关于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,我可以显示数据。下面是一段代码

    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

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

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

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

2 个答案:

答案 0 :(得分:0)

如果您想从客户那里获取名称,请尝试

    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

答案 1 :(得分:0)

我认为你只想使用

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