NodeList.SelectSingleNode()语法

时间:2012-06-26 17:09:54

标签: c# xml xpath xml-namespaces selectsinglenode

让NodeList.SelectSingleNode()正常工作时遇到问题。 我的XML看起来像这样:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<inm:Results xmlns:inm="http://www.namespace.com/1.0">
    <inm:Recordset setCount="18254">
        <inm:Record setEntry="0">
            <!-- snip -->
            <inm:Image>fileName.jpg</inm:Image>
        </inm:Record>
    </inm:Recordset>
</inm:Results>

数据是一系列<inm:Record>个条目。

我打开文档并根据“inm:Record”创建一个NodeList对象。这很有效。

XmlDocument xdoc = new XmlDocument();
xdoc.Load(openFileDialog1.FileName);
XmlNodeList xRecord = xdoc.GetElementsByTagName("inm:Record");

我开始使用for循环遍历NodeList。在处理给定条目之前,我想检查并查看<inm:Image>是否已设置。我认为这样做非常容易

string strImage = xRecord[i].SelectSingleNode("inm:Image").InnerText;

我的想法是,“对于我正在使用的XRecord,请找到<inm:Image>值...但这不起作用,因为我得到异常,说我需要一个XmlNameSpaceManager。所以,我试图设置它,但永远不会正确的语法。

在这种情况下,有人可以告诉我如何使用正确的XmlNameSpaceManager语法。

我现在解决了这个问题,循环遍历给定xRecord的所有childNodes,并在循环到它后检查标记。我想首先检查该值,看看是否需要循环遍历<inm:Record>条目。

4 个答案:

答案 0 :(得分:2)

无需遍历所有Record元素,只需使用XPath指定所需的子集:

XmlDocument xdoc = new XmlDocument();
xdoc.Load(openFileDialog1.FileName);
XmlNamespaceManager manager = new XmlNamespaceManager(xdoc.NameTable);
manager.AddNamespace("inm", "http://www.inmagic.com/webpublisher/query");
XmlNodeList nodes = xdoc.SelectNodes("/inm:Results/inm:Recordset/inm:Record[inm:Image != '']", manager);

答案 1 :(得分:0)

XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
string strImage = xRecord[i].SelectSingleNode("inm:Image",nsMgr).InnerText; 

应该这样做。

答案 2 :(得分:0)

使用LINQ to XML库,这是检索所述节点值的示例:

XDocument doc = XDocument.Load(openFileDialog1.FileName);
List<XElement> docElements = doc.Elements().ToList();
XElement results = docElements.Elements().Where(
   ele => ele.Name.LocalName == "Results").First();
XElement firstRecord = results.Elements().Where(
   ele => ele.Name.LocalName == "Record").First();
XElement recordImage = firstRecord .Elements().Where(
   ele => ele.Name.LocalName == "Image").First();
string imageName = recordImage.Value;

顺便说一下,使用Hungarian notation for a type-checked language is overkill。当字符串变量始终为str时,您不需要使用string前置字符串变量。

答案 3 :(得分:0)

使用此Xml library,您可以获得具有Image子元素的所有记录:

XElement root = XElement.Load(openFileDialog1.FileName);
XElement[] records = root.XPath("//Record[Image]").ToArray();

如果要确保Image子项包含值,可以表示如下:

XElement[] records = root.XPath("//Record[Image != '']").ToArray();