C#XML如何按属性检索字段的innerText?

时间:2012-07-20 16:06:34

标签: c# xml xml-parsing

以下是XML示例:

  <?xml version="1.0" ?> 
  <XMLScreen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CX>80</CX> 
  <CY>24</CY> 
  <Formatted>true</Formatted> 
  <Field>
  <Location position="1" left="1" top="0" length="69" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  *SDC SCHEDULING CATEGORY UPDATE 
  </Field>
  </XMLScreen>

我想根据Location position

来检索每个字段的内部文本

到目前为止我所拥有的是:

  XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.LoadXml(myEm.CurrentScreenXML.GetXMLText());
  XmlNodeList fields = xmlDoc.GetElementsByTagName("Field");

  MessageBox.Show("Field spot: " + i + " Contains: " + fields[i].InnerText);

我希望能够通过传递一些位置位置来提取字段的内部文本。所以如果我说foo[i]我希望能够获得innertext

  

* SDC调度类别更新

3 个答案:

答案 0 :(得分:0)

类似的东西,使用XDocument而不是XmlDocument(好吧,如果你不在.net 3.5或更高版本,我们就会遇到问题)。

private string GetTextByLocationId(XDocument document, int id)
{
     var field = document.Descendants("Field").FirstOrDefault(m => m.Element("Location").Attribute("position").Value == id.ToString());
     if (field == null) return null;
     return field.Value;
}

和用法

var xDocument = XDocument.Load(<pathToXmlFile or XmlReader or string or ...>);
var result = GetTextByLocationId(xDocument, 1);

修改

或者如果你想要一个字典:key = position / value = text

private static Dictionary<int, string> ParseLocationAndText(XDocument document)
        {
            var fields = document.Descendants("Field");
            return fields.ToDictionary(
                 f => Convert.ToInt32(f.Element("Location").Attribute("position").Value),
                 f => f.Value);
        }

答案 1 :(得分:0)

您应该使用xpath搜索查询:

  XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.LoadXml(xml);
  int nodeId = 4;
  XmlNode node = xmlDoc.SelectSingleNode(String.Format(@"//Location[@position='{0}']", nodeId));
  if (node != null)
  {
      String field = node.ParentNode.InnerText;
  }

答案 2 :(得分:0)

尝试,

XElement root = XElement.Parse(myEm.CurrentScreenXML.GetXMLText());
XElement field = root.XPathSelectElement(
                    string.Format("Field[Location/@position='{0}']", 1));
string text = field.Value;

您需要使用以下命令将XPath与XElements一起使用。

using System.Xml.XPath;