Find values under one node in XML

那年仲夏 提交于 2019-12-20 06:47:17

问题


Below is xml file format from which words to be searched.

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

I used the below XPath expressions in C# to find values of Char Node.

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

Here, how to get a complete word with XPath from above XML File ?


回答1:


It is not possible theoretically. The reason is that XML/XPATH does not ensure order as the result of a query is a "node-set" which by definition is "an unordered collection of nodes without duplicates".

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

Nevertheless, you can get close to the requirement. For example, you can get the first word:

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



回答2:


I would use 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();

--EDIT--

for @Y.Ecarri

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


来源:https://stackoverflow.com/questions/12800833/find-values-under-one-node-in-xml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!