0

下面是要搜索的词的 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 节点的值。

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

在这里,如何从上面的 XML 文件中用 XPath 得到一个完整的单词?

4

2 回答 2

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();
于 2012-10-09T13:18:05.003 回答
1

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

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;
}
于 2012-10-09T13:17:27.730 回答