在XML中的一个节点下查找值

时间:2012-10-09 13:11:26

标签: c# winforms visual-studio-2008 xpath

以下是要搜索的单词的xml文件格式。

<Book>
<Page id="1">
<Head>Preface</Head>
<Body>
<Paragraph>
    <Line>
        <Word>
            <Char>T</Char>
            <Char>h</Char>
            <Char>i</Char>
            <Char>s</Char>
        </Word>
        <Word>
            <Char>-</Char>
        </Word>
        <Word>
            <Char>i</Char>
            <Char>s</Char>
        </Word>
        <Word>
            <Char>-</Char>
        </Word>
        <Word>
            <Char>s</Char>
            <Char>a</Char>
            <Char>m</Char>
            <Char>p</Char>
            <Char>l</Char>
            <Char>e</Char>
        </Word>
        <Word>
            <Char>-</Char>
        </Word>
        <Word>
            <Char>t</Char>
            <Char>e</Char>
            <Char>x</Char>
            <Char>t</Char>
        </Word>
    </Line>
</Paragraph>
</Body>
</Page>

我在C#中使用了下面的XPath表达式来查找Char Node的值。

XmlDocument objXmlDoc = new XmlDocument();
XmlNodeList objXmlNodeList;
objXmlDoc.Load(sFilePath);
objXmlNodeList = objXmlDoc.SelectNodes("//CHAR[translate(text(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" + txtFindText.Text.ToUpper() + "']");

在这里,如何从上面的XML文件中获取XPath的完整单词?

2 个答案:

答案 0 :(得分:2)

我会使用Linq2Xml

XDocument xDoc = XDocument.Parse(xml); //or XDocument.Load(fileName)
var words = xDoc.Descendants("Word")
                .Select(w => String.Join("",w.Descendants("Char").Select(c => c.Value)))
                .ToList();

- 编辑 -

代表@ Y.Ecarri

var words2 = xDoc.XPathSelectElements("//Word")
                 .Select(w => String.Join("", w.Elements().Select(c => c.Value)))
                 .ToList();

答案 1 :(得分:1)

理论上不可能。原因是XML / XPATH不能确保顺序,因为查询的结果是&#34;节点集&#34;根据定义,它是&#34;无序重复的节点集合&#34;。

http://www.w3.org/TR/xpath/

尽管如此,您可以接近要求。例如,您可以获得第一个词:

XmlDocument objXmlDoc = new XmlDocument();
XmlNodeList objXmlNodeList;
objXmlDoc.Load(sFilePath);
objXmlNodeList = objXmlDoc.SelectNodes("//Word");
string s = string.Empty;
XmlNodeList wordNodes = objXmlNodeList[0].ChildNodes;
foreach (XmlNode characterNode in wordNodes)
{
   s = s + characterNode.InnerText;
}