2

让 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

4 回答 4

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);
于 2012-06-26T17:35:30.657 回答
0
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
string strImage = xRecord[i].SelectSingleNode("inm:Image",nsMgr).InnerText; 

应该这样做。

于 2012-06-26T17:23:20.663 回答
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;

另外,顺便说一句,对类型检查语言使用匈牙利表示法是矫枉过正的。您不需要在字符串变量前面加上strwhen 它总是一个string.

于 2012-06-26T17:27:55.123 回答
0

使用这个Xml 库,您可以获取所有具有 Image 子元素的记录:

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

如果您想确定 Image 子项包含一个值,可以这样表示:

XElement[] records = root.XPath("//Record[Image != '']").ToArray();
于 2012-06-26T18:51:18.353 回答