我正在将字符串加载到包含以下结构的XML文档:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Include="clsWorker.cs" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
然后我将所有加载到xmldocument:
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(Xml);
Run Code Online (Sandbox Code Playgroud)
然后出现以下问题:
XmlNode Node = xmldoc.SelectSingleNode("//Compile"); // return null
Run Code Online (Sandbox Code Playgroud)
当我从根元素(Project)中删除xmlns属性时,它的工作正常,如何改进我的SelectSingleNode以返回相关元素?
我相信这是可能的,但无法弄清楚语法.像这样的东西:
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
Run Code Online (Sandbox Code Playgroud)
但这不正确.
我想从XML文件中获取值但是我失败了.能帮我指出问题吗?因为我已经非常努力地测试和谷歌搜索,但我仍然无法发现问题.
XML:
<?xml version="1.0" encoding="utf-8" ?>
<Contacts>
- <Contact>
<ID>xxx</ID>
<AutoUpdateEnabled>false</AutoUpdateEnabled>
<LastChanged>2013-05-29T01:53:59.4470000Z</LastChanged>
- <Profiles>
- <Personal>
<FirstName>My First Name</FirstName>
<LastName>My Last Name</LastName>
<UniqueName>My Unique Name</UniqueName>
<SortName></SortName>
<DisplayName>My Display Name</DisplayName>
</Personal>
</Profiles>
- <Phones>
- <Phone>
<ID>3</ID>
<PhoneType>Mobile</PhoneType>
<Number>000-0000000</Number>
<IsIMEnabled>false</IsIMEnabled>
<IsDefault>false</IsDefault>
</Phone>
</Phones>
- <Locations>
- <Location>
<ID>2</ID>
<LocationType>Business</LocationType>
<CompanyName></CompanyName>
<IsDefault>false</IsDefault>
</Location>
</Locations>
</Contact>
- <Contact>
<ID>xxx</ID>
<AutoUpdateEnabled>false</AutoUpdateEnabled>
<LastChanged>2013-05-29T01:53:25.2670000Z</LastChanged>
- <Profiles>
- <Personal>
<FirstName>Person</FirstName>
<LastName>Two</LastName>
<UniqueName></UniqueName>
<SortName></SortName>
<DisplayName>Person Two</DisplayName>
</Personal>
</Profiles>
- <Emails>
- <Email>
<ID>1</ID>
<EmailType>Personal</EmailType>
<Address>MyTest@gmail.com</Address>
<IsIMEnabled>false</IsIMEnabled>
<IsDefault>true</IsDefault>
</Email> …Run Code Online (Sandbox Code Playgroud) 我想选择带有条件Xpath的xml节点 -
xmlnode.SelectSingleNode("if (ns:substanceAdministration/ns:consumable/@typeCode == UNK) then evaluateThisXpath else evaluateOtherXpath")
Run Code Online (Sandbox Code Playgroud)
我担心的是 -
<drugID code="UNK">
<sub code="2232" />
</drugID>
Run Code Online (Sandbox Code Playgroud)
如果父节点的@code是UNK,那么只有它应该取子节点的@code值,否则取父@code值.
我正在考虑这样的方法.如果这实际上可以这样工作,请告诉我:对于示例XML:
<Root>
<Node>
<SubEl1>abc</SubEl1>
<SubEl2>def</SubEl2>
<SubEl3>123</SubEl3>
<SubEl4>456</SubEl4>
</Node>
</Root>
Run Code Online (Sandbox Code Playgroud)
想要进入<Node>,循环检查节点/元素名称并获取它的值.像这样的东西,比如名字'SubEl1'对task1使用'abc',看到元素名称是'SubEl2'我做task2.必须检查所有子元素!
示例(不工作代码):
//looping through 'Node' children
switch(SubElName for 'Node element)
{
case : 'SubEl1'
//Do Task1 using the SubEl1's value/TextName ...
case: 'SubEl2'
//Task2 ...
...
case: default //Do default task.....
}
//end loop
Run Code Online (Sandbox Code Playgroud)
如果你能想到任何其他方法(XElement,XmlDocument,SelectNodes()等,那也将受到赞赏!
我试图选择除脚本节点以外的节点和一个名为'relativeNav'的类的ul.有人可以指引我走正确的道路吗?我已经搜索了一个星期,我无法在任何地方找到它.目前我有这个,但它显然也选择了// ul [@ class ='relativeNav'].反正是否有一个NOT表达式,以便SelectNode会忽略那个?
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//body//*[not(self::script)]/text()"))
{
Console.WriteLine("Node: " + node);
singleString += node.InnerText.Trim() + "\n";
}
Run Code Online (Sandbox Code Playgroud) 我无法理解为什么这个NodeList是空的
XmlDocument document = new XmlDocument();
document.Load(xmlpath);
XmlNodeList nodes = document.SelectNodes("/StructureResponse/rootItem/attributes/Attribute");
Run Code Online (Sandbox Code Playgroud)
这里是XmlFile
<?xml version="1.0" encoding="utf-8"?>
<StructureResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://nts-de-osm1-pxc/webservices/">
<consolidatedItems xsi:nil="true" xmlns="http://systinet.com/wsdl/com/osm/webservices/service/" />
<rootItem xsi:type="Part" xmlns="http://systinet.com/wsdl/com/osm/webservices/service/">
<attributes>
<Attribute>
<dataDictionary xsi:nil="true" />
<dataType>string</dataType>
<displayName>IDENT_NR</displayName>
<key>true</key><name>IDENT_NR</name>
<searchable>true</searchable>
<userAttribute>true</userAttribute>
<value>9662744</value>
</Attribute>
<Attribute>
<dataDictionary xsi:nil="true" />
<dataType>string</dataType>
<displayName>AI</displayName>
<key>true</key><name>AI</name>
<searchable>true</searchable>
<userAttribute>true</userAttribute>
<value>00</value>
</Attribute>
</rootItem>
</StructureResponse>
Run Code Online (Sandbox Code Playgroud)
在最终脚本中,我想获得一个包含其中每个属性的数组字符串.
谢谢Stefan
SelectNodes和GetElementsByTagName之间的主要区别是什么.
我将以下字符串加载到XML文档:
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>El cliente con los parámetros introducidos no existe./faultstring>
<detail>
<ns:ClienteWSDo29Exception xmlns:ns="http://services.do29.imq.es">
<Do29Exception xmlns="http://services.do29.imq.es" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ax211="http://model.do29.imq.es/xsd" xmlns:ax213="http://dto.do29.imq.es/xsd" xmlns:ax29="http://exception.do29.imq.es/xsd" xsi:type="ax29:Do29Exception">
<ax29:classname>class es.imq.do29.dao.ClienteDaoImpl</ax29:classname>
<ax29:trace xsi:nil="true" />
<ax29:previous xsi:nil="true" />
<ax29:method>getCliente</ax29:method>
<ax29:id>1</ax29:id>
<ax29:message>El cliente con los parámetros introducidos no existe.</ax29:message>
</Do29Exception>
</ns:ClienteWSDo29Exception>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
然后在xml中使用命名空间的情况我试过:
XmlDocument xmldocu = new XmlDocument();
xmldocu.LoadXml(xml);
XmlNamespaceManager namespaces = new XmlNamespaceManager(xmldocu.NameTable);
namespaces.AddNamespace("ax29", "http://services.do29.imq.es");
XmlNode nodemsgx = xmldocu.SelectSingleNode("//message", namespaces);
XmlNode nodemsg = xmldocu.SelectSingleNode("//ax29:message", namespaces);
Run Code Online (Sandbox Code Playgroud)
但是nodemsgx和nodemsg是null:S怎么做正确的方法呢?我使用//消息因为我想要获得该类型的任何节点而不是该节点的特定路径...
我正在开发一个自动化测试应用程序,目前我正在编写一个函数来比较两个XML文件之间的值,这些文件应该是相同的,但可能不是.以下是我正在尝试处理的XML示例:
<?xml version="1.0" encoding="utf-8"?>
<report xmlns="http://www.**.com/**">
<subreport name="RBDReport">
<record rowNumber="1">
<field name="Time">
<value>0</value>
</field>
<field name="Reliability">
<value>1.000000</value>
</field>
<field name="Unreliability">
<value>0.000000</value>
</field>
<field name="Availability">
<value> </value>
</field>
<field name="Unavailability">
<value> </value>
</field>
<field name="Failure Rate">
<value>N/A</value>
</field>
<field name="Number of Failures">
<value> </value>
</field>
<field name="Total Downtime">
<value> </value>
</field>
</record>
Run Code Online (Sandbox Code Playgroud)
(注意,可能有多个<subreport>元素,其中包含多个<record>元素.)
我想要的是提取<value>两个文档的标签,然后比较它们的值.那部分我知道怎么做.问题在于提取本身.
由于我遇到了C++,我正在使用MSXML,并编写了一个包装器,允许我的应用程序抽象出实际的XML操作,以防我决定更改我的数据格式.
该包装器CSimpleXMLParser加载XML文档并将其"最高记录"设置为XML文档的document元素.(CRecord是一个抽象类,其CXMLRecord是其子类之一,它可以单独或按组访问子记录,还允许访问Record的"值"(对于子元素或属性的值,在CXMLRecord的情况下) .)CXMLRecord包含一个MSXML :: MSXMLDOMNodePtr和一个指向CSimpleXMLParser实例的指针.)包装器还包含返回子项的实用程序函数,CXMLRecord用它来返回子记录.
在我的代码中,我执行以下操作(尝试返回所有<subreport>节点只是为了查看它是否有效):
CSimpleXMLParser parserReportData;
parserReportData.OpenXMLDocument(strPathToXML);
bool bGetChildrenSuccess = parserReportData.GetFirstRecord()->GetChildRecords(listpChildren, _T("subreport"));
Run Code Online (Sandbox Code Playgroud)
这总是返回false.CXMLRecord :: GetChildRecords()的实现基本上是肉
MSXML2::IXMLDOMNodeListPtr pListChildren …Run Code Online (Sandbox Code Playgroud)