2012-07-20 75 views
1

这里是XML示例:C#XML如何通过属性检索字段的innerText?

<?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调度类别UPDATE

回答

0

类似的东西,用的XDocument代替的XmlDocument(当然,如果你不是。净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); 

编辑

,或者如果你想用的字典:键=位置/值=文本

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); 
     } 
+0

如何加载XDocument?它只是一个XML文档? – CodingIsAwesome 2012-07-20 16:30:22

+0

@CodingIsAwesome如代码所示,它可能是一个文件,一个XmlReader,一个字符串:请参阅http://msdn.microsoft.com/en-US/library/system.xml.linq.xdocument.load%28v=vs .100%29 – 2012-07-20 16:34:17

+0

@CodingIsAwesome XDocument在System.Xml.Linq – 2012-07-20 16:36:02

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; 
    } 
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;