我可以从XML文件中的特定位置获取数据吗?

时间:2014-08-07 12:40:27

标签: c# xml

我试图将位置中的值分配给字符串。我无法弄清楚如何设置此属性部分。

string type = null;

type = xmlNodeComplex4.ParentNode.ParentNode.ParentNode.PreviousSibling.PreviousSibling.PreviousSibling.FirstChild.NextSibling.FirstChild.Attributes["@ID"+ RefID1].FirstChild.NextSibling.NextSibling.FirstChild.InnerText;

这不起作用。我有FirstChild.Attributes [" @ ID" + RefID1]不起作用。代码编译没有问题..但这行采取转储,我得到一个错误。我知道这是我试图访问属性部分的方式。我已经为[]中的数据尝试了许多不同的组合。有没有办法做到这一点,如果是这样,有人可以指导我朝着正确的方向。

RefID是一个字符串,其中包含类似_154的数据。 FirstChild位置有一个看起来像这样的属性。

<CATALOG>
  <OBJECTS>
    <REFS ID = "_150">
        <CITY>Centerville</CITY>
        <STATE>Ohio</STATE>
        <ZIP>45459</ZIP>
    </REFS>

    <REFS ID = "_154">
        <CITY>Troy</CITY>
        <STATE>Michigan</STATE>
        <ZIP>48083</ZIP>
    </REFS>

  </OBJECTS>
  <PLANT>
     <COMMON>Bloodroot</COMMON>
     <BOTANICAL>Sanguinaria canadensis</BOTANICAL>
     <ZONE>4</ZONE>
     <LIGHT>Mostly Shady</LIGHT>
     <PRICE>$2.44</PRICE>
     <RefID1>_0154</RefID1>

  </PLANT>
</CATALOG>

3 个答案:

答案 0 :(得分:0)

我在下面看到了你的评论。然后你可以圈出所有节点,当你找到你用RefID1寻找的节点时 - >进入它的孩子并获得类型。

XmlNodeList xnList = xml.SelectNodes("/Element[@*]");
foreach (XmlNode xn in xnList)
{
  if(xn.Attributes["ID"].Value == RefID1)
  {
    string type = xn.FirstChild.NextSibling.NextSibling.FirstChild.InnerText;
  }
}

答案 1 :(得分:0)

您可以按标记选择节点并获取ID属性的值。

XmlNode childNode = parentNode.SelectSingleNode("DATA");
if (childNode!= null)
{
   type = childNode.Attributes["ID"].Value;
}

答案 2 :(得分:0)

使用XML的这个小片段,我只能建议使用SelectSingleNode()这样的通用XPath:

string xpath = String.Format("//DATA[@ID='{0}'", RefID1);
string state = myXmlDocument.SelectSingleNode(xpath).InnerText;

高于XPath意味着在xml文档中的任何级别选择<DATA>元素,其属性ID值等于RefID1的值。

更新:

鉴于更新的XML,您可以尝试这种方式:

string xpath = String.Format("//REFS[@ID='{0}']/STATE", RefID1);
string data = myXmlDocument.SelectSingleNode(xpath).InnerText;

或者如果您确实需要查询相对于xmlNodeComplex4

string xpath = String.Format("./../preceding-sibling::OBJECTS/REFS[@ID='{0}']/STATE", RefID1);
var state = xmlNodeComplex4.SelectSingleNode(xpath).InnerText;

您可以看到XPath /..ParentNode类似,而/preceding-siblingPreviousSibling类似。