【发布时间】:2010-09-11 04:44:07
【问题描述】:
如何验证特定元素是否存在于 XML 文件中?假设我有一个不断变化的 XML 文件,我需要在读取/解析它之前验证每个元素是否存在。
【问题讨论】:
如何验证特定元素是否存在于 XML 文件中?假设我有一个不断变化的 XML 文件,我需要在读取/解析它之前验证每个元素是否存在。
【问题讨论】:
if(doc.SelectSingleNode("//mynode")==null)....
应该这样做(其中 doc 显然是您的 XmlDocument 对象)
或者,您可以使用 XSD 并针对它进行验证
【讨论】:
您可以遍历每个节点并查看是否存在节点。
doc.Load(xmlPath);
XmlNodeList node = doc.SelectNodes("//Nodes/Node");
foreach (XmlNode chNode in node)
{
try{
if (chNode["innerNode"]==null)
return true; //node exists
//if ... check for any other nodes you need to
}catch(Exception e){return false; //some node doesn't exists.}
}
您遍历 Nodes 下的每个 Node 元素(比如说这是根)并检查是否存在名为“innerNode”的节点(如果需要,添加其他节点)。 try..catch 是因为我怀疑如果节点不存在,这会引发流行的“未设置对象引用”错误。
【讨论】:
//如果问题是“只是”在您之前验证该元素是否存在于 xml 文件中 //提取你可以这样做的值
XmlNodeList YOURTEMPVARIABLE = doc.GetElementsByTagName("YOUR_ELEMENTNAME");
if (YOURTEMPVARIABLE.Count > 0 )
{
doctype = YOURTEMPVARIABLE[0].InnerXml;
}
else
{
doctype = "";
}
【讨论】:
不确定您想要做什么,但使用 DTD 或架构可能是您验证 xml 所需要的全部内容。
否则,如果您想查找一个元素,您可以使用 xpath 查询来搜索特定元素。
【讨论】:
试试这个怎么样:
using (XmlTextReader reader = new XmlTextReader(xmlPath))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
//do your code here
}
}
}
【讨论】:
除了sangam 代码
if (chNode["innerNode"]["innermostNode"]==null)
return true; //node *parentNode*/innerNode/innermostNode exists
【讨论】:
以下是一个简单的函数,用于检查 xml 文件中是否存在特定节点。
public boolean envParamExists(String xmlFilePath, String paramName){
try{
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(xmlFilePath));
doc.getDocumentElement().normalize();
if(doc.getElementsByTagName(paramName).getLength()>0)
return true;
else
return false;
}catch (Exception e) {
//error handling
}
return false;
}
【讨论】:
有点晚了,但如果有帮助,这对我有用...
XmlNodeList NodoEstudios = DocumentoXML.SelectNodes("//ALUMNOS/ALUMNO[@id=\"" + Id + "\"]/estudios");
string Proyecto = "";
foreach(XmlElement ElementoProyecto in NodoEstudios)
{
XmlNodeList EleProyecto = ElementoProyecto.GetElementsByTagName("proyecto");
Proyecto = (EleProyecto[0] == null)?"": EleProyecto[0].InnerText;
}
【讨论】:
//使用XmlReader检查xml元素值是否存在
using (XmlReader xmlReader = XmlReader.Create(new StringReader("XMLSTRING")))
{
if (xmlReader.ReadToFollowing("XMLNODE"))
{
string nodeValue = xmlReader.ReadElementString("XMLNODE");
}
}
【讨论】:
刚刚遇到了同样的问题,null-coalescing operator 和 SelectSingleNode 发挥了作用,用 string.Empty 分配 null
foreach (XmlNode txElement in txElements)
{
var txStatus = txElement.SelectSingleNode(".//ns:TxSts", nsmgr).InnerText ?? string.Empty;
var endToEndId = txElement.SelectSingleNode(".//ns:OrgnlEndToEndId", nsmgr).InnerText ?? string.Empty;
var paymentAmount = txElement.SelectSingleNode(".//ns:InstdAmt", nsmgr).InnerText ?? string.Empty;
var paymentAmountCcy = txElement.SelectSingleNode(".//ns:InstdAmt", nsmgr).Attributes["Ccy"].Value ?? string.Empty;
var clientId = txElement.SelectSingleNode(".//ns:OrgnlEndToEndId", nsmgr).InnerText ?? string.Empty;
var bankSortCode = txElement.SelectSingleNode(".//ns:OrgnlEndToEndId", nsmgr).InnerText ?? string.Empty;
//TODO finish Object creation and Upsert DB
}
【讨论】:
string name = "some node name";
var xDoc = XDocument.Load("yourFile");
var docRoot = xDoc.Element("your docs root name");
var aNode = docRoot.Elements().Where(x => x.Name == name).FirstOrDefault();
if (aNode == null)
{
return $"file has no {name}";
}
【讨论】:
//我发现子节点 ERNO 排在倒数第二位
If StrComp(xmlnode(i).ChildNodes.Item(xmlnode(i).ChildNodes.Count - 1).Name.ToString(), "ERNO", CompareMethod.Text) = 0 Then
xmlnode(i).ChildNodes.Item(xmlnode(i).ChildNodes.Count - 1).InnerText = c
Else
elem = xmldoc.CreateElement("ERNo")
elem.InnerText = c.ToString
root.ChildNodes(i).AppendChild(elem)
End If
【讨论】: